package metier.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import metier.Grade;
import configuration.MessageAppli;


public class GradeJdbc {
	
	private GradeJdbc(){
	}
	
	/**
	 * Retourne la liste copmplete des grades de la base.
	 * @param Connection connexion à la base
	 * @return <code>ArrayList<Stage><code> La liste des grades.
	 */
	public static ArrayList<Grade> getListeGrade(Connection c) {
		ArrayList<Grade> lGrade = new ArrayList<Grade>();
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT * FROM grade");

			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				lGrade.add(new Grade(res.getInt("idGrade"), res.getString("libellegrade"),
						res.getString("abrev"),res.getInt("rang")));
			}
			ps.close();
		} catch (SQLException e) {
			e.getStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		if ( lGrade.isEmpty()){
			return null;
		}else{
			return lGrade;
		}
	}
	
	/**
	 * Regourne le grade pour l'id correspondant.
	 * @param Connection connexion à la base
	 * @return Grade
	 */
	public static Grade getGradeById(Connection c, int id) {
		Grade grade = null;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT * FROM grade WHERE idGrade = " + id);

			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				grade = new Grade(res.getInt("idGrade"), res.getString("libellegrade"),
						res.getString("abrev"),res.getInt("rang"));
			}
			ps.close();
		} catch (SQLException e) {
			e.getStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return grade;
	}
	
	/**
	 * Regourne le grade pour libelle correspondant.
	 * @param Connection connexion à la base
	 * @return Grade
	 */
	public static Grade getGradeByLibelle(Connection c, String abrev) {
		Grade grade = null;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT * FROM grade WHERE abrev like '" + abrev + "'");

			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				grade = new Grade(res.getInt("idGrade"), res.getString("libellegrade"),
						res.getString("abrev"),res.getInt("rang"));
			}
			ps.close();
		} catch (SQLException e) {
			e.getStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return grade;
	}
	
	/**
	 * Retourne le libelle complet d'un grade.
	 * @param Connection connexion à la base
	 * @return String libelle
	 */
	public static String getLibelleGradeById(Connection c, int id) {
		String libelle = null;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT libelle FROM grade WHERE idGrade = " + id);

			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				libelle = res.getString("libellegrade");
			}
			ps.close();
		} catch (SQLException e) {
			e.getStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return libelle;
	}
	
	/**
	 * Retourne l'abreviation d'un grade.
	 * @param Connection connexion à la base
	 * @return String abrev
	 */
	public static String getAbrevGradeById(Connection c, int id) {
		String abrev = null;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT abrev FROM grade WHERE idGrade = " + id);

			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				abrev = res.getString("abrev");
			}
			ps.close();
		} catch (SQLException e) {
			e.getStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return abrev;
	}	
	
	/**
	 * Retourne le rang d'un grade.
	 * @param Connection connexion à la base
	 * @return int rang
	 */
	public static int getRangGradeById(Connection c, int id) {
		int rang = 7;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT rang FROM grade WHERE idGrade = " + id);

			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				rang = res.getInt("rang");
			}
			ps.close();
		} catch (SQLException e) {
			e.getStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return rang;
	}	
	
	/**
	 * Retourne le grade suivant.
	 * @param Connection connexion à la base
	 * @return id du grade suivant sinon null si grade max.
	 */
	public static int getGradeSuivant(Connection c, int idGrade) {
		int idGradeSuivant = -1;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT idGrade FROM grade WHERE rang < " + idGrade);

			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				idGradeSuivant = res.getInt("idGrade");
				break;
			}
			ps.close();
		} catch (SQLException e) {
			e.getStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return idGradeSuivant;
	}	
	
	/**
	 * Retourne le grade precedent.
	 * @param Connection connexion à la base
	 * @return id du grade precedent sinon null si grade min.
	 */
	public static int getGradePrecedent(Connection c, int idGrade) {
		int idGradeSuivant = -1;
		// préparer la requete sql 
		try {
			PreparedStatement ps=c.prepareStatement("SELECT idGrade FROM grade WHERE rang > " + idGrade);

			// Res commence par 1 et pas 0.
			ResultSet res = ps.executeQuery();
			while(res.next()){
				idGradeSuivant = res.getInt("idGrade");
				break;
			}
			ps.close();
		} catch (SQLException e) {
			e.getStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return idGradeSuivant;
	}
}

